package util;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * 拼音工具类，将汉语拼音映射为字母字符串
 */
public class PinyinUtil {
    //定义汉语拼音的配置，  全局常量,配置将汉语转为英文的所有配置信息
    private static final HanyuPinyinOutputFormat FORMAT;
    //所有的中文对应unicode编码区间
    private static final String CHINESE_PATTERN = "[\\u4E00-\\u9FA5]";
    //使用静态代码块,加载Format ,配置一些配置信息
    static {
        FORMAT = new HanyuPinyinOutputFormat();
        //设置转换后的英文字母全部为小写
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        //设置汉语拼音是否带音调
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        //英文中不存在u：因此需要将u：转为v 绿 ： lv,设置特殊字符带v
        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);

    }

    /**
     * 文件名中是否包含中文
     * @param str
     * @return
     */
    public static boolean containsChinese(String str) {
        return str.matches(".*" + CHINESE_PATTERN + ".*");
    }

    /**
     * 将汉字转为拼音
     * @param fileName 传入的文件名
     * @return 返回拼音全写和首字母缩写
     */
    public static String[] getPinyinByFileName(String fileName){
        String[] ret = new String[2];//创建长度为2的数组，用来保存文件的全拼和首字母
        StringBuilder allNameAppender = new StringBuilder();//全称拼音
        StringBuilder firstNameAppender = new StringBuilder();//首字符拼音
        //按照配置的拼音转换配置，将文件名全部转换为英文,保存在数组中
        for (char c : fileName.toCharArray()) {
            try {
                //逐个将字符转为汉语拼音，该方法只有遇见中文时，才会转型，碰见非中文，转成null，或者有空字符，长度为0
                String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
                //将转完后的拼音，判断长度，如果为null或者长度为0，表示非汉语，将fileName中的非中文直接加入拼音
                if (pinyins.length == 0 || pinyins == null){//
                    allNameAppender.append(c);
                    firstNameAppender.append(c);
                }else {//将转换后的拼音加入到全拼和简拼中
                    allNameAppender.append(pinyins[0]);
                    firstNameAppender.append(pinyins[0].charAt(0));
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                //当遇见转换异常时，也直接将字符添加进去
                allNameAppender.append(c);
                firstNameAppender.append(c);
            }
        }
        ret[0] = allNameAppender.toString();//结果集中的第一个保存全拼
        ret[1] = firstNameAppender.toString();//第二个保存简拼
        return ret;
    }

    public static void main(String[] args) throws BadHanyuPinyinOutputFormatCombination {
        String str1 = "我是莲子宝宝";
        String str2 = "莲子is a goddess,她才18岁";
        System.out.println(Arrays.toString(getPinyinByFileName(str1)));
        System.out.println(Arrays.toString(getPinyinByFileName(str2)));
        //静态类的静态方法：PinyinHelper.toHanyuPinyinStringArray()，汉字字符转拼音
//        String[] ss1 = PinyinHelper.toHanyuPinyinStringArray('F');
//        String[] ss;
//        ss = PinyinHelper.toHanyuPinyinStringArray('绿',FORMAT);
//        System.out.println(Arrays.toString(ss));
//        System.out.println(Arrays.toString(ss1));
    }


}
